/**
 * 表单验证函数
 * formcheck-0.0.2
 * 增加默认添加显示信息功能
 */
$.extend({
    formCheck: function(opt, callback) {
		var defaults = {
			// 提示信息
			onShow: "",
			// 输入时提示信息
			onFocus: "",
			// 错误信息
			onError: "",
			// 成功信息
			onCorrect: "",
			// 空值信息
			onEmpty: "",
			// 受检查id集合
			idArray:new Array(),
			// 验证结果
			checkResult:true,
			// 图片路径
			imgPath : ""
		};
		
		var regExg = {
			notEmpty : /^\s*(\S+\s*)+$/, // 不为空，首位中间都可以有空格
			notAllEmpty : /^\S+$/, // 不为空，首位中间都不能有空格
			notEmptyEnd : /^\s*(\S+\s*)+\S+$/, // 不为空，尾部不能有空格，头部中间可以有空格
			notEmptyHeadAndEnd : /^\s*(\S+\s*)+$/, // 不为空，首尾不能有空格，中间可以有空格
			eMail : /^[0-9a-zA-Z][\w\\.]+@(\w+\.)+\w+$/, // email  验证
			mobile : /^1[3,5,8]\d{9}$/, // 手机号码
			phone : /^(((010)|(02\d{1})|(0[3-9]\d{2}))-?)?\d{7,8}(-\d{1,4})?$/, // 固定电话，可带区号，可带分机号，用"-"做间隔
			chinese : /^[\u4e00-\u9fa5]+$/, // 汉字
			chineseLimit : "^[\u4e00-\u9fa5]{m,n}$", // 限制汉字字数
			passwordLimit : "^(\\w){m,n}$", //指定长度范围的字母、数字、下划线的组合
			loginNameLimit : "^[A-Za-z](\\w){m,n}$" //指定长度范围的字母、数字、下划线的组合
		}
		
		/**
		 * 验证汉字，首位中间都可以有空格
		 * param id 字段id
		 * param opt 提示信息
		 * param required 是否必填
		 * param m 最小长度
		 * param n 最大长度
		 */
		this.regChineseLimit = function(id, opt, m, n, required){
			if( m < 0){
				m = 0;
			}
			if( n < m ){
				n = m;
			}
			var _opt = opt
			var test = regExg.chineseLimit.replace("m", m);
			test = test.replace("n", n);
			//alert(test);
			showInfo(id, _opt, new RegExp(test), required);
		};
		
		/**
		 * 验证字母、数字、下划线的组合-密码
		 * param id 字段id
		 * param opt 提示信息
		 * param required 是否必填
		 * param m 最小长度
		 * param n 最大长度
		 */
		this.regPasswordLimit = function(id, opt, m, n, required){
			if( m < 0){
				m = 0;
			}
			if( n < m ){
				n = m;
			}
			var _opt = opt
			var test = regExg.passwordLimit.replace("m", m);
			test = test.replace("n", n);
			showInfo(id, _opt, new RegExp(test), required);
		};
		
		/**
		 * 验证字母、数字、下划线的组合-用户名，字符必须为字母
		 * param id 字段id
		 * param opt 提示信息
		 * param required 是否必填
		 * param m 最小长度
		 * param n 最大长度
		 */
		this.regLoginNameLimit = function(id, opt, m, n, required){
			if( m < 1){
				m = 1;
			}
			if( n < m ){
				n = m;
			}
			var _opt = opt
			// 首字符必须为字母，所以最大长度和最小长度都减去1
			var test = regExg.loginNameLimit.replace("m", m - 1);
			test = test.replace("n", n - 1);
			showInfo(id, _opt, new RegExp(test), required);
		};
		
		/**
		 * 验证汉字，首位中间都可以有空格
		 * param id 字段id
		 * param opt 提示信息
		 * param required 是否必填
		 */
		this.regChinese = function(id, opt, required){
			var _opt = opt
			showInfo(id, _opt, regExg.chinese, required);
		};
		
		/**
		 * 验证不为空，首位中间都不可以有空格
		 * param id 字段id
		 * param opt 提示信息
		 * param required 是否必填
		 */
		this.regAllEmpty = function(id, opt, required){
			var _opt = opt
			showInfo(id, _opt, regExg.notAllEmpty, required);
		};
		
		/**
		 * 验证不为空，首位中间都可以有空格
		 * param id 字段id
		 * param opt 提示信息
		 * param required 是否必填
		 */
		this.regEmpty = function(id, opt, required){
			var _opt = opt
			showInfo(id, _opt, regExg.notEmpty, required);
		};
		
		/**
		 * 验证手机
		 * param id 字段id
		 * param opt 提示信息
		 * param required 是否必填
		 */
		this.regMobile = function(id, opt, required){
			var _opt = opt
			showInfo(id, _opt, regExg.mobile, required);
		};
		
		
		/**
		 * 验证邮箱
		 * param id 字段id
		 * param opt 提示信息
		 * param required 是否必填
		 */
		this.regEmail = function(id, opt, required){
			var _opt = opt
			showInfo(id, _opt, regExg.eMail, required);
		};
		
		/**
		 * 提示信息
		 * param id 字段id
		 * param opt 提示信息
		 * param regTest 验证方式
		 * param required 是否必填
		 */
		function showInfo(id, opt, regTest, required){
			var opts = $.extend(defaults, opt);
			var obj = $("#" + id);
			
			// 当没有显示信息标签的时候
			if($("#" + id + "Tip").size() == 0){
				obj.after("<span id=\"" + id + "Tip\" ></span>");
			}
			var tip = $("#" + id + "Tip");
			
			defaults.idArray.push(id);
			$("#" + id).data(id + "onShow", opts.onShow);
			$("#" + id).data(id + "onFocus", opts.onFocus);
			$("#" + id).data(id + "onCorrect", opts.onCorrect);
			$("#" + id).data(id + "onError", opts.onError);
			
			tip.html("<img src=\"" + opts.imgPath + "img/onShow.gif\" valign=\"middle\" />" + $("#" + id).data(id + "onShow"));
			obj.focus(function(){
				tip.html("<img src=\"" + opts.imgPath + "img/onFocus.gif\" valign=\"middle\" />" + $("#" + id).data(id + "onFocus"));
				tip.css({
					"background":"#E9F0FF"
				});
			});
			
			obj.blur(function(){
				if(required || regExg.notEmpty.test(obj.val())){
					if(regTest.test(obj.val())){
						tip.html("<img src=\"" + opts.imgPath + "img/onCorrect.gif\" valign=\"middle\" />" + $("#" + id).data(id + "onCorrect"));
						tip.css({
							"background":"#E9FFEB"
						});
					}else{
						tip.html("<img src=\"" + opts.imgPath + "img/onError.gif\" valign=\"middle\" />" + $("#" + id).data(id + "onError"));
						tip.css({
							"background":"#FFF2E9"
						});
						defaults.checkResult =  false;
					}
				}else{
					tip.html("<img src=\"" + opts.imgPath + "img/onShow.gif\" valign=\"middle\" />" + $("#" + id).data(id + "onShow"));
					tip.css({
						"background":"transparent"
					});
				}
			});
		}
		
		/**
		 * 提交表单时，遍历验证注册字段
		 * @param formId 表单id
		 */
		this.formCheck = function(formId){
			var form = $("#" + formId);
			form.submit(function(){
				defaults.checkResult = true;
				for(var i = 0; i < defaults.idArray.length; i++){
					$("#" + defaults.idArray[i]).blur();
					if(!defaults.checkResult)
						return false;
				}
				return defaults.checkResult;
			});
		};
		// 返回表单验证对象
		return this;
	}	
});